package org.jsola.hr.web;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.jsola.core.Page;
import org.jsola.core.Result;
import org.jsola.hr.dto.user.AddUserDTO;
import org.jsola.hr.dto.user.UpdateUserPasswordDTO;
import org.jsola.hr.dto.user.UpdateUserRoleDTO;
import org.jsola.hr.query.HrUserQuery;
import org.jsola.hr.vo.HrUserVO;
import org.jsola.user.query.UserQuery;
import org.jsola.user.vo.UserVO;

import java.util.List;

/**
 * @author JanusMix
 */
@Api(tags = "hr-用户管理")
public interface IUserControllerAPI {

    /**
     * 管理员修改用户角色
     *
     * @param updateUserRoleDTO 修改用户信息DTO
     * @return 更新行数
     */
    @ApiOperation(value = "管理员修改用户角色")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "updateUserRoleDTO", dataType = "UpdateUserRoleDTO", value = "修改用户信息", paramType = "body")
    })
    Result<String> updateUserRole(UpdateUserRoleDTO updateUserRoleDTO);

    @ApiOperation(value = "重置密码")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "updateUserPasswordDTO", dataType = "UpdateUserPasswordDTO", value = "修改用户信息", paramType = "body")
    })
    Result<String> updateUserPassword(UpdateUserPasswordDTO updateUserPasswordDTO);

    /**
     * 新增用户信息
     *
     * @param addUserDTO 新增用户信息DTO
     * @return 更新行数
     */
    @ApiOperation(value = "新增用户信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "addUserDTO", dataType = "AddUserDTO", value = "新增用户信息", paramType = "body")
    })
    Result<HrUserVO> saveUser(AddUserDTO addUserDTO);

    /**
     * 员工列表
     *
     * @param hrUserQuery 查询参数
     * @return UserVO
     */
    @ApiOperation(value = "员工列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "hrUserQuery", dataType = "HrUserQuery", value = "用户查询条件", paramType = "query")
    })
    Result<List<HrUserVO>> queryUserList(HrUserQuery hrUserQuery);

    /**
     * 派单查询员工列表(没有校验权限)
     *
     * @param hrUserQuery 查询参数
     * @return UserVO
     */
    @ApiOperation(value = "员工列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "hrUserQuery", dataType = "HrUserQuery", value = "用户查询条件", paramType = "query")
    })
    Result<List<HrUserVO>> queryDispatchUserList(HrUserQuery hrUserQuery);

    /**
     * 员工列表 权限小于自己
     *
     * @param hrUserQuery 查询参数
     * @return UserVO
     */
    @ApiOperation(value = "员工列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "hrUserQuery", dataType = "HrUserQuery", value = "用户查询条件", paramType = "query")
    })
    Result<List<HrUserVO>> queryUserListLessToMe(HrUserQuery hrUserQuery);

    /**
     * 查询拥有某公司权限的用户列表
     *
     * @param userQuery 查询参数
     * @param companyId 公司id
     * @return list对象
     */
    @ApiOperation(value = "查询拥有某公司权限的用户列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyId", dataType = "String", value = "公司id", paramType = "path"),
            @ApiImplicitParam(name = "userQuery", dataType = "UserQuery", value = "用户查询对象", paramType = "query")

    })
    Result<List<HrUserVO>> listUserHasRoleInCompany(String companyId, UserQuery userQuery);

    /**
     * 查询拥有某公司权限的用户列表(分页)
     *
     * @param userQuery 查询参数
     * @param companyId 公司id
     * @return list对象
     */
    @ApiOperation(value = "查询拥有某公司权限的用户列表(分页)")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyId", dataType = "String", value = "公司id", paramType = "path"),
            @ApiImplicitParam(name = "userQuery", dataType = "UserQuery", value = "用户查询对象", paramType = "query")

    })
    Result<Page<HrUserVO>> pageUserHasRoleInCompany(String companyId, UserQuery userQuery);

    /**
     * 查询拥有某公司权限的用户列表
     *
     * @param userQuery 查询参数
     * @return list对象
     */
    @ApiOperation(value = "查询拥有某租户权限的用户列表(分页)")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userQuery", dataType = "UserQuery", value = "用户查询对象", paramType = "query")

    })
    Result<List<HrUserVO>> listUserHasRoleInSite(UserQuery userQuery);

    /**
     * 查询拥有某公司权限的用户列表(分页)
     *
     * @param userQuery 查询参数
     * @return list对象
     */
    @ApiOperation(value = "查询拥有某租户权限的用户列表(分页)")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userQuery", dataType = "UserQuery", value = "用户查询对象", paramType = "query")

    })
    Result<Page<HrUserVO>> pageUserHasRoleInSite(UserQuery userQuery);

    /**
     * 查询拥有某公司下员工对应用户及能管理该公司的用户列表
     *
     * @param companyId 公司id
     * @param userQuery 查询参数
     * @return list对象
     */
    @ApiOperation(value = "查询拥有某公司下员工对应用户及能管理该公司的用户列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyId", dataType = "String", value = "公司id", paramType = "path"),
            @ApiImplicitParam(name = "userQuery", dataType = "UserQuery", value = "用户查询对象", paramType = "query")

    })
    Result<List<HrUserVO>> listEmpAndRoleUserInCompany(String companyId, UserQuery userQuery);

    /**
     * 查询拥有某公司下员工对应用户及能管理该公司的用户列表(分页)
     *
     * @param companyId 公司id
     * @param userQuery 查询参数
     * @return list对象
     */
    @ApiOperation(value = "查询拥有某公司下员工对应用户及能管理该公司的用户列表(分页)")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "companyId", dataType = "String", value = "公司id", paramType = "path"),
            @ApiImplicitParam(name = "userQuery", dataType = "UserQuery", value = "用户查询对象", paramType = "query")

    })
    Result<Page<HrUserVO>> pageEmpAndRoleUserInCompany(String companyId, UserQuery userQuery);

    /**
     * 简单员工分页，只包含id和姓名
     *
     * @param userQuery 查询对象
     * @return UserVO
     */
    @ApiOperation(value = "简单员工分页，只包含id和姓名")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userQuery", dataType = "UserQuery", value = "用户查询对象", paramType = "query")
    })
    Result<Page<HrUserVO>> querySimpleUserPage(UserQuery userQuery);

    @ApiOperation(value = "批量离职用户")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userIds", dataType = "String[]", value = "用户id数组", paramType = "body", allowMultiple = true)
    })
    Result<String> dimissionUsers(String[] userIds);

    @ApiOperation(value = "批量删除用户")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userIds", dataType = "String[]", value = "用户id数组", paramType = "body", allowMultiple = true)
    })
    Result<String> deleteUsers(String[] userIds);

    @ApiOperation(value = "为所有用户更新拼音字段")
    Result<String> updateAllUserPinyin();

    @ApiOperation(value = "当前登录用户是分公司人员还是总公司人员,1:总公司人员,2:分公司人员,3:其他人员")
    Result<Integer> userIsSuperme();

    @ApiOperation(value = "获取当前登录用户信息")
    Result<HrUserVO> getCurrentUserInfo();

    @ApiOperation(value = "小程序,获取当前登录用户信息")
    Result<HrUserVO> smallProgramGetCurrentUserInfo();

    /**
     * 查询站点下所有管理员
     * @return 站点下所有管理员
     */
    @ApiOperation(value = "查询站点下所有管理员")
    Result<List<UserVO>> selectHadRoleUserIdBySiteId();
}
